package com.munhrasoft.dinamica.managedbeans;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.TabChangeEvent;

import com.munhrasoft.dinamica.business.entities.Procurador;
import com.munhrasoft.dinamica.business.logic.ProcuradorEJB;

@ManagedBean
@ViewScoped
public class ProcuradorController {

    /*
     * Acho que nao vai precisar de ficar inicializando direto os objetos como no exemplo do
     * tabchanged, acho que quem anulava o objeto de pesquisa era o datatable
     */

    private static Logger    logger         = Logger.getLogger(ProcuradorController.class.getName());

    @EJB
    private ProcuradorEJB    procuradorEJB;

    private Procurador       procurador     = new Procurador();
    private Procurador       pesqprocurador = new Procurador();
    private Procurador       resprocurador  = new Procurador();
    private List<Procurador> procuradorList = new ArrayList<Procurador>();

    @PostConstruct
    public void init() {
        logger.info("PostConstruct");
        procuradorList = procuradorEJB.fetchAllProcuradores();
        pesqprocurador = new Procurador();
        procurador = new Procurador();
        resprocurador = new Procurador();
    }

    public void createProcurador(ActionEvent actionEvent) {
        procurador = procuradorEJB.createProcurador(procurador);
        procurador = new Procurador();
        pesqprocurador = new Procurador();
        showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                "Procurador criado com sucesso");
    }

    public void pegarTodosProcuradores(ActionEvent actionEvent) {
        procuradorList = procuradorEJB.fetchAllProcuradores();

        if (!procuradorList.isEmpty()) {
            pesqprocurador = procuradorList.get(0);
        } else {
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Nenhum procurador encontrado");
        }

    }

    public void saveProcurador(ActionEvent actionEvent) {
        pesqprocurador = procuradorEJB.updateProcurador(pesqprocurador);
        if (pesqprocurador != null) {
            showMessage(FacesMessage.SEVERITY_INFO, "Operação concluída",
                    "Procurador atualizado com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Erro", "O Procurador não foi atualizado");
        }
    }

    public void removeProcurador(ActionEvent actionEvent) {
        // TODO acho que nao vai dar para apenas remover o corretor, se ele estiver amarrado
        // a algum processo.

        if (pesqprocurador != null) {
            procuradorEJB.removeProcurador(pesqprocurador);
            procuradorList = procuradorEJB.fetchAllProcuradores();
            pesqprocurador = new Procurador();
            showMessage(FacesMessage.SEVERITY_INFO, "Operaçãoo concluída",
                    "Procurador removido com sucesso");
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Operação falhou",
                    "Procurador não selecionado");
        }

    }

    public void rowSelect(SelectEvent event) {
        logger.info("Row select");
        pesqprocurador = resprocurador;

    }

    public void changeTabView(TabChangeEvent event) {
        logger.info("Tabview changed " + event.getTab().getId());
        procuradorList = procuradorEJB.fetchAllProcuradores();
        pesqprocurador = new Procurador();
        procurador = new Procurador();
    }

    private void showMessage(Severity sev, String summary, String detail) {
        FacesMessage message = new FacesMessage(sev, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    public Procurador getProcurador() {
        return procurador;
    }

    public void setProcurador(Procurador procurador) {
        this.procurador = procurador;
    }

    public Procurador getPesqprocurador() {
        return pesqprocurador;
    }

    public void setPesqprocurador(Procurador pesqprocurador) {
        this.pesqprocurador = pesqprocurador;
    }

    public Procurador getResprocurador() {
        return resprocurador;
    }

    public void setResprocurador(Procurador resprocurador) {
        this.resprocurador = resprocurador;
    }

    public List<Procurador> getProcuradorList() {
        return procuradorList;
    }

    public void setProcuradorList(List<Procurador> procuradorList) {
        this.procuradorList = procuradorList;
    }

}
